/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pr3.funcion;

import pr3.cromosoma.Estado;

/**
 *
 * @author Gonzalo Ortiz Jaureguizar (gortiz at software.imdea.org)
 */
public class DU extends Funcion {
    
    static final int MAX_ITERACIONES = 50;
    static int iteracionesRestantes = 0;
    Funcion accion;
    Funcion predicado;

    public DU() {
    }

    public DU(Funcion accion, Funcion predicado) {
        this.accion = accion;
        this.predicado = predicado;
    }

    public Funcion getAccion() {
        return accion;
    }

    public void setAccion(Funcion accion) {
        this.accion = accion;
    }

    public Funcion getPredicado() {
        return predicado;
    }

    public void setPredicado(Funcion predicado) {
        this.predicado = predicado;
    }
    
    public static void nuevoCaso() {
        iteracionesRestantes = MAX_ITERACIONES;
    }

    @Override
    public Boolean evaluar(Estado estado) {
//        int iteracionesRestantes = MAX_ITERACIONES;
        while(iteracionesRestantes > 0) {
            iteracionesRestantes--;
            accion.evaluar(estado);
            if(seCumplePredicado(estado)) {
                return true;
            }
        }
        return false;
    }
    
    private boolean seCumplePredicado(Estado estado) {
        Object valor = predicado.evaluar(estado);
        if(valor == null || valor instanceof Boolean && !((Boolean)valor)) {
            return false;
        }
        return true;
    }
    @Override
    public int getAridad() {
        return 2;
    }

    @Override
    public void setArgumento(int i, Funcion arg) {
        switch(i) {
            case 0:
                accion = arg;
                break;
            case 1:
                predicado = arg;
                break;
            default:
                throw new IllegalArgumentException("Not supported.");
        }        
    }

    @Override
    public Funcion getArgumento(int i) {
        switch(i) {
            case 0:
                return accion;
            case 1:
                return predicado;
            default:
                throw new IllegalArgumentException("Not supported.");
        }
    }

    @Override
    public Funcion clone() {
        DU clon = new DU(accion.clone(), predicado.clone());
        clon.accion.setPadre(clon);
        clon.predicado.setPadre(clon);
        return clon;
    }

    @Override
    public String toString(int profundidad) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < profundidad; i++) {
            sb.append("  ");
        }
        sb.append("DU");
        sb.append('\n');
        sb.append(accion.toString(profundidad + 1));
        sb.append('\n');
        sb.append(predicado.toString(profundidad + 1));
        return sb.toString();
    }
    
    public String toString() {
        return toString(0);
    }
    
    
    
}
